gtk_widget_get_state_flags
gtk_widget_has_default
gtk_widget_has_focus
+gtk_widget_has_visible_focus
gtk_widget_has_grab
gtk_widget_has_rc_style
gtk_widget_is_drawable
gtk_window_set_opacity
gtk_window_get_mnemonics_visible
gtk_window_set_mnemonics_visible
+gtk_window_get_focus_visible
+gtk_window_set_focus_visible
gtk_window_set_has_resize_grip
gtk_window_get_has_resize_grip
gtk_window_resize_grip_is_visible
"Net/EnableInputFeedbackSounds\0" "gtk-enable-input-feedback-sounds\0"
"Net/EnableEventSounds\0" "gtk-enable-event-sounds\0"
"Gtk/CursorBlinkTimeout\0" "gtk-cursor-blink-timeout\0"
- "Gtk/AutoMnemonics\0" "gtk-auto-mnemonics\0";
+ "Gtk/AutoMnemonics\0" "gtk-auto-mnemonics\0"
+ "Gtk/VisibleFocus\0" "gtk-visible-focus\0";
static const struct
{ 1573, 1603 },
{ 1636, 1658 },
{ 1682, 1705 },
- { 1730, 1748 }
+ { 1730, 1748 },
+ { 1767, 1784 }
};
gtk_window_get_destroy_with_parent
gtk_window_get_focus
gtk_window_get_focus_on_map
+gtk_window_get_focus_visible
gtk_window_get_gravity
gtk_window_get_group
gtk_window_get_has_resize_grip
gtk_window_set_destroy_with_parent
gtk_window_set_focus
gtk_window_set_focus_on_map
+gtk_window_set_focus_visible
gtk_window_set_geometry_hints
gtk_window_set_gravity
gtk_window_set_has_resize_grip
gint focus_pad;
GtkAllocation allocation;
GtkStyleContext *context;
+ gboolean draw_focus;
widget = GTK_WIDGET (button);
context = gtk_widget_get_style_context (widget);
width -= default_outside_border.left + default_outside_border.right;
height -= default_outside_border.top + default_outside_border.bottom;
}
-
- if (!interior_focus && gtk_widget_has_focus (widget))
+
+ draw_focus = gtk_widget_has_visible_focus (widget);
+
+
+ if (!interior_focus && draw_focus)
{
x += focus_width + focus_pad;
y += focus_width + focus_pad;
x, y, width, height);
}
- if (gtk_widget_has_focus (widget))
+ if (draw_focus)
{
gint child_displacement_x;
gint child_displacement_y;
y += child_displacement_y;
}
- gtk_render_focus (context, cr,
- x, y, width, height);
+ gtk_render_focus (context, cr, x, y, width, height);
}
gtk_style_context_restore (context);
pango_cairo_show_layout (cr, layout);
}
- if (gtk_widget_has_focus (widget)
- && priv->focus_row == row && priv->focus_col == col)
+ if (gtk_widget_has_visible_focus (widget) &&
+ priv->focus_row == row && priv->focus_col == col)
gtk_render_focus (context, cr,
day_rect.x, day_rect.y,
day_rect.width, day_rect.height);
if (gtk_cell_area_get_edited_cell (area))
render_data.paint_focus = FALSE;
+ if (!gtk_widget_has_visible_focus (widget))
+ render_data.paint_focus = FALSE;
+
/* If no cell can activate but the caller wants focus painted,
* then we paint focus around all cells */
if ((flags & GTK_CELL_RENDERER_FOCUSED) != 0 && paint_focus &&
cairo_t *cr)
{
GtkCheckButton *check_button = GTK_CHECK_BUTTON (widget);
- gint border_width;
- gint interior_focus;
- gint focus_width;
- gint focus_pad;
-
- gtk_widget_style_get (widget,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- NULL);
gtk_check_button_draw_indicator (check_button, cr);
- border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
- if (gtk_widget_has_focus (widget))
+ if (gtk_widget_has_visible_focus (widget))
{
GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget));
GtkStyleContext *context;
GtkStateFlags state;
GtkAllocation allocation;
+ gint border_width;
+ gint interior_focus;
+ gint focus_width;
+ gint focus_pad;
+
+ border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+
+ gtk_widget_style_get (widget,
+ "interior-focus", &interior_focus,
+ "focus-line-width", &focus_width,
+ "focus-padding", &focus_pad,
+ NULL);
gtk_widget_get_allocation (widget, &allocation);
context = gtk_widget_get_style_context (widget);
gdk_cairo_set_source_rgba (cr, &color);
cairo_paint (cr);
- if (gtk_widget_has_focus (drawing_area))
+ if (gtk_widget_has_visible_focus (drawing_area))
{
set_focus_line_attributes (drawing_area, cr, &focus_width);
gtk_entry_draw_progress (widget, context, cr);
- if (gtk_widget_has_focus (widget) && !priv->interior_focus)
+ if (gtk_widget_has_visible_focus (widget) && !priv->interior_focus)
{
x -= priv->focus_width;
y -= priv->focus_width;
gtk_expander_paint (expander, cr);
- if (gtk_widget_has_focus (widget))
+ if (gtk_widget_has_visible_focus (widget))
gtk_expander_paint_focus (expander, cr);
GTK_WIDGET_CLASS (gtk_expander_parent_class)->draw (widget, cr);
cairo_surface_t *source;
cairo_t *source_cr;
gint stride;
- gint focus_width;
- gint focus_pad;
-
- gtk_widget_style_get (widget,
- "focus-line-width", &focus_width,
- "focus-padding", &focus_pad,
- NULL);
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
/* Paints the HSV triangle */
static void
-paint_triangle (GtkHSV *hsv,
- cairo_t *cr)
+paint_triangle (GtkHSV *hsv,
+ cairo_t *cr,
+ gboolean draw_focus)
{
GtkHSVPrivate *priv = hsv->priv;
GtkWidget *widget = GTK_WIDGET (hsv);
/* Draw focus outline */
- if (gtk_widget_has_focus (widget) &&
- !priv->focus_on_ring)
+ if (draw_focus && !priv->focus_on_ring)
{
gint focus_width;
gint focus_pad;
/* Paints the contents of the HSV color selector */
static gboolean
-gtk_hsv_draw (GtkWidget *widget,
- cairo_t *cr)
+gtk_hsv_draw (GtkWidget *widget,
+ cairo_t *cr)
{
GtkHSV *hsv = GTK_HSV (widget);
GtkHSVPrivate *priv = hsv->priv;
+ gboolean draw_focus;
+
+ draw_focus = gtk_widget_has_visible_focus (widget);
paint_ring (hsv, cr);
- paint_triangle (hsv, cr);
+ paint_triangle (hsv, cr, draw_focus);
+
- if (gtk_widget_has_focus (widget) && priv->focus_on_ring)
+ if (draw_focus && priv->focus_on_ring)
{
GtkStyleContext *context;
GtkStateFlags state;
cairo_save (cr);
gtk_cairo_transform_to_window (cr, widget, icon_view->priv->bin_window);
-
+
cairo_set_line_width (cr, 1.);
gtk_icon_view_get_drag_dest_item (icon_view, &path, &dest_pos);
else
dest_index = -1;
- for (icons = icon_view->priv->items; icons; icons = icons->next)
+ for (icons = icon_view->priv->items; icons; icons = icons->next)
{
GtkIconViewItem *item = icons->data;
GdkRectangle paint_area;
{
gtk_icon_view_paint_item (icon_view, cr, item,
((GdkRectangle *)item)->x, ((GdkRectangle *)item)->y,
- icon_view->priv->draw_focus);
-
+ icon_view->priv->draw_focus);
+
if (dest_index == item->index)
dest_item = item;
}
rect.x, rect.y,
rect.width, rect.height);
}
-
+
if (icon_view->priv->doing_rubberband)
gtk_icon_view_paint_rubberband (icon_view, cr);
focus_link = gtk_label_get_focus_link (label);
active_link = info->active_link;
-
if (active_link)
{
GdkRGBA bg_color;
cairo_restore (cr);
}
- if (focus_link && gtk_widget_has_focus (widget))
+ if (focus_link && gtk_widget_has_visible_focus (widget))
{
range[0] = focus_link->start;
range[1] = focus_link->end;
break;
}
+ /* make focus visible in a window that receives a key event */
+ {
+ GtkWidget *window;
+ GtkPolicyType visible_focus;
+
+ window = gtk_widget_get_toplevel (grab_widget);
+ g_object_get (gtk_widget_get_settings (grab_widget), "gtk-visible-focus", &visible_focus, NULL);
+ if (GTK_IS_WINDOW (window) && visible_focus != GTK_POLICY_NEVER)
+ gtk_window_set_focus_visible (GTK_WINDOW (window), TRUE);
+ }
+
/* Catch alt press to enable auto-mnemonics;
* menus are handled elsewhere
* FIXME: this does not work with mnemonic modifiers other than Alt
mnemonics_visible = (event->type == GDK_KEY_PRESS);
window = gtk_widget_get_toplevel (grab_widget);
-
if (GTK_IS_WINDOW (window))
gtk_window_set_mnemonics_visible (GTK_WINDOW (window), mnemonics_visible);
}
page->allocation.height,
get_tab_gap_pos (notebook));
- if (gtk_widget_has_focus (widget) &&
+ if (gtk_widget_has_visible_focus (widget) &&
priv->cur_page == page)
{
gint focus_width, focus_pad;
gtk_style_context_restore (context);
- if (sensitive && gtk_widget_has_focus (widget))
+ if (sensitive && gtk_widget_has_visible_focus (widget))
{
gtk_style_context_save (context);
gtk_style_context_set_state (context,
PROP_TOOLBAR_STYLE,
PROP_TOOLBAR_ICON_SIZE,
PROP_AUTO_MNEMONICS,
+ PROP_VISIBLE_FOCUS,
PROP_APPLICATION_PREFER_DARK_THEME,
PROP_BUTTON_IMAGES,
PROP_ENTRY_SELECT_ON_FOCUS,
NULL);
g_assert (result == PROP_AUTO_MNEMONICS);
+ /**
+ * GtkSettings:gtk-visible-focus:
+ *
+ * Whether 'focus rectangles' should be always visible, never visible,
+ * or hidden until the user starts to use the keyboard.
+ *
+ * Since: 3.2
+ */
+ result = settings_install_property_parser (class,
+ g_param_spec_enum ("gtk-visible-focus",
+ P_("Visible Focus"),
+ P_("Whether 'focus rectangles' should be hidden until the user starts to use the keyboard."),
+ GTK_TYPE_POLICY_TYPE,
+ GTK_POLICY_ALWAYS,
+ GTK_PARAM_READWRITE),
+ NULL);
+ g_assert (result == PROP_VISIBLE_FOCUS);
+
/**
* GtkSettings:gtk-application-prefer-dark-theme:
*
width = gtk_widget_get_allocated_width (widget);
height = gtk_widget_get_allocated_height (widget);
- if (gtk_widget_has_focus (widget))
+ if (gtk_widget_has_visible_focus (widget))
gtk_render_focus (context, cr, x, y, width, height);
x += focus_width + focus_pad;
"interior-focus", &interior_focus,
NULL);
- if (gtk_widget_has_focus (widget) && !interior_focus)
+ if (gtk_widget_has_visible_focus (widget) && !interior_focus)
{
GtkStyleContext *context;
retval = GTK_WIDGET_CLASS (gtk_tray_icon_parent_class)->draw (widget, cr);
focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget));
- if (focus_child && gtk_widget_has_focus (focus_child))
+ if (focus_child && gtk_widget_has_visible_focus (focus_child))
{
GtkStyleContext *context;
GtkStateFlags state;
GtkWidget *widget = GTK_WIDGET (tree_view);
gint w, h;
- if (!gtk_widget_has_focus (widget))
+ if (!gtk_widget_has_visible_focus (widget))
return;
w = gdk_window_get_width (tree_view->priv->bin_window) - 2;
if (node == cursor && has_can_focus_cell
&& ((column == tree_view->priv->focus_column
&& tree_view->priv->draw_keyfocus &&
- gtk_widget_has_focus (widget))
+ gtk_widget_has_visible_focus (widget))
|| (column == tree_view->priv->edited_column)))
draw_focus = TRUE;
else
/* draw the big row-spanning focus rectangle, if needed */
if (!has_can_focus_cell && node == cursor &&
tree_view->priv->draw_keyfocus &&
- gtk_widget_has_focus (widget))
+ gtk_widget_has_visible_focus (widget))
{
gint tmp_y, tmp_height;
GtkStateFlags focus_rect_state = 0;
return widget->priv->has_focus;
}
+/**
+ * gtk_widget_has_visible_focus:
+ * @widget: a #GtkWidget
+ *
+ * Determines if the widget should show a visible indication that
+ * it has the global input focus. This is a convenience function for
+ * use in ::draw handlers that takes into account whether focus
+ * indication should currently be shown in the toplevel window of
+ * @widget. See gtk_window_get_focus_visible() for more information
+ * about focus indication.
+ *
+ * To find out if the widget has the global input focus, use
+ * gtk_widget_has_focus().
+ *
+ * Return value: %TRUE if the widget should display a 'focus rectangle'
+ *
+ * Since: 3.2
+ */
+gboolean
+gtk_widget_has_visible_focus (GtkWidget *widget)
+{
+ gboolean draw_focus;
+
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+
+ if (widget->priv->has_focus)
+ {
+ GtkWidget *toplevel;
+
+ toplevel = gtk_widget_get_toplevel (widget);
+
+ if (GTK_IS_WINDOW (toplevel))
+ draw_focus = gtk_window_get_focus_visible (GTK_WINDOW (toplevel));
+ else
+ draw_focus = TRUE;
+ }
+ else
+ draw_focus = FALSE;
+
+ return draw_focus;
+}
+
/**
* gtk_widget_is_focus:
* @widget: a #GtkWidget
gboolean gtk_widget_get_can_focus (GtkWidget *widget);
gboolean gtk_widget_has_focus (GtkWidget *widget);
gboolean gtk_widget_is_focus (GtkWidget *widget);
+gboolean gtk_widget_has_visible_focus (GtkWidget *widget);
void gtk_widget_grab_focus (GtkWidget *widget);
void gtk_widget_set_can_default (GtkWidget *widget,
guint maximize_initially : 1;
guint mnemonics_visible : 1;
guint mnemonics_visible_set : 1;
+ guint focus_visible : 1;
guint modal : 1;
guint opacity_set : 1;
guint position : 3;
/* Readonly properties */
PROP_IS_ACTIVE,
PROP_HAS_TOPLEVEL_FOCUS,
-
+
/* Writeonly properties */
PROP_STARTUP_ID,
-
+
PROP_MNEMONICS_VISIBLE,
+ PROP_FOCUS_VISIBLE,
LAST_ARG
};
P_("Icon for this window"),
GDK_TYPE_PIXBUF,
GTK_PARAM_READWRITE));
+
+ /**
+ * GtkWindow:mnemonics-visible:
+ *
+ * Whether mnemonics are currently visible in this window.
+ *
+ * This property is maintained by GTK+ based on the
+ * #GtkSettings:gtk-auto-mnemonics setting and user input,
+ * and should not be set by applications.
+ *
+ * Since: 2.20
+ */
g_object_class_install_property (gobject_class,
PROP_MNEMONICS_VISIBLE,
g_param_spec_boolean ("mnemonics-visible",
P_("Whether mnemonics are currently visible in this window"),
TRUE,
GTK_PARAM_READWRITE));
+
+ /**
+ * GtkWindow:focus-visible:
+ *
+ * Whether 'focus rectangles' are currently visible in this window.
+ *
+ * This property is maintained by GTK+ based on the
+ * #GtkSettings:gtk-visible-focus setting and user input
+ * and should not be set by applications.
+ *
+ * Since: 2.20
+ */
+ g_object_class_install_property (gobject_class,
+ PROP_FOCUS_VISIBLE,
+ g_param_spec_boolean ("focus-visible",
+ P_("Focus Visible"),
+ P_("Whether focus rectangles are currently visible in this window"),
+ TRUE,
+ GTK_PARAM_READWRITE));
/**
* GtkWindow:icon-name:
priv->initial_timestamp = GDK_CURRENT_TIME;
priv->has_resize_grip = TRUE;
priv->mnemonics_visible = TRUE;
+ priv->focus_visible = TRUE;
g_object_ref_sink (window);
priv->has_user_ref_count = TRUE;
case PROP_MNEMONICS_VISIBLE:
gtk_window_set_mnemonics_visible (window, g_value_get_boolean (value));
break;
+ case PROP_FOCUS_VISIBLE:
+ gtk_window_set_focus_visible (window, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_MNEMONICS_VISIBLE:
g_value_set_boolean (value, priv->mnemonics_visible);
break;
+ case PROP_FOCUS_VISIBLE:
+ g_value_set_boolean (value, priv->focus_visible);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
GdkWindow *toplevel;
GdkWindow *gdk_window;
gboolean auto_mnemonics;
+ GtkPolicyType visible_focus;
gdk_window = gtk_widget_get_window (widget);
if (priv->startup_id != NULL)
{
/* Make sure we have a "real" id */
- if (!startup_id_is_fake (priv->startup_id))
+ if (!startup_id_is_fake (priv->startup_id))
gdk_notify_startup_complete_with_id (priv->startup_id);
g_free (priv->startup_id);
/* if auto-mnemonics is enabled and mnemonics visible is not already set
* (as in the case of popup menus), then hide mnemonics initially
*/
- g_object_get (gtk_widget_get_settings (widget), "gtk-auto-mnemonics",
- &auto_mnemonics, NULL);
+ g_object_get (gtk_widget_get_settings (widget),
+ "gtk-auto-mnemonics", &auto_mnemonics,
+ "gtk-visible-focus", &visible_focus,
+ NULL);
+
if (auto_mnemonics && !priv->mnemonics_visible_set)
gtk_window_set_mnemonics_visible (window, FALSE);
+
+ /* inherit from transient parent, so that a dialog that is
+ * opened via keynav shows focus initially
+ */
+ if (priv->transient_parent)
+ gtk_window_set_focus_visible (window, gtk_window_get_focus_visible (priv->transient_parent));
+ else
+ gtk_window_set_focus_visible (window, visible_focus == GTK_POLICY_ALWAYS);
}
static gboolean
if (auto_mnemonics)
maybe_set_mnemonics_visible (window);
}
-
+
return FALSE;
}
priv->mnemonics_visible_set = TRUE;
}
+/**
+ * gtk_window_get_focus_visible:
+ * @window: a #GtkWindow
+ *
+ * Gets the value of the #GtkWindow:focus-visible property.
+ *
+ * Returns: %TRUE if 'focus rectangles' are supposed to be visible
+ * in this window.
+ *
+ * Since: 3.2
+ */
+gboolean
+gtk_window_get_focus_visible (GtkWindow *window)
+{
+ g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+ return window->priv->focus_visible;
+}
+
+/**
+ * gtk_window_set_focus_visible:
+ * @window: a #GtkWindow
+ * @setting: the new value
+ *
+ * Sets the #GtkWindow:focus-visible property.
+ *
+ * Since: 3.2
+ */
+void
+gtk_window_set_focus_visible (GtkWindow *window,
+ gboolean setting)
+{
+ GtkWindowPrivate *priv;
+
+ g_return_if_fail (GTK_IS_WINDOW (window));
+
+ priv = window->priv;
+
+ setting = setting != FALSE;
+
+ if (priv->focus_visible != setting)
+ {
+ priv->focus_visible = setting;
+ g_object_notify (G_OBJECT (window), "focus-visible");
+ }
+}
+
void
_gtk_window_get_wmclass (GtkWindow *window,
gchar **wmclass_name,
void gtk_window_set_mnemonics_visible (GtkWindow *window,
gboolean setting);
gboolean gtk_window_get_mnemonics_visible (GtkWindow *window);
+void gtk_window_set_focus_visible (GtkWindow *window,
+ gboolean setting);
+gboolean gtk_window_get_focus_visible (GtkWindow *window);
void gtk_window_set_resizable (GtkWindow *window,
gboolean resizable);